2
2
.
.
2
2
I
I
n
n
t
t
e
e
r
r
c
c
e
e
p
p
t
t
o
o
r
r
s
s
I
I
n
n
f
f
o
o
[
[
R
R
]
]
Interceptor is Java Class that is used to intercept HTTP Requests and Responses.
Interceptors perform additional operations before sending
HTTP Request to the Controller (they can modify HTTP Request before it gets to Controller)
HTTP Response from the Controller (it can modify HTTP Response before it is returned to the User)
Every Interceptor is called twice (because HTTP Requests & Responses pass through same Interceptors)
first during HTTP Request
then during HTTP Response
Your custom Interceptor Class needs
to implement HandlerInterceptor Interface (so that Spring would know how to use it)
to @Override preHandle() Method (contains actual useful code performed by the Filter)
to @Override postHandle() Method (contains actual useful code performed by the Filter)
to @Override afterCompletion() Method (contains actual useful code performed by the Filter)
@Component Annotation (for Spring to detect it and create Interceptor Object)
Interceptors are used for (same as Filters)
Security (create Authentication Object from JWT Authorities)
Logging (log HTTP Requests/Responses: User, Endpoint, HTTP Response)
Error Handling (give feedback to User if HTTP Request has invalid Parameters/Format)
Filter is called twice
I
I
n
n
t
t
e
e
r
r
c
c
e
e
p
p
t
t
o
o
r
r
C
C
h
h
a
a
i
i
n
n
Interceptor Chain is ordered set of Interceptors that are
called in sequence before sending HTTP Request to the Controller
called in reverse order before sending HTTP Response from the Controller
Interceptor Chain allows you to organize complex Interceptor Logic into multiple Interceptor Classes.
Interceptors are called in reverse order during HTTP Response
Interceptor 1
Controller
(Endpoints)
Request
Response
Interceptor 2
Request
Response
Request
Response
Interceptor
Request
Response
Request
Response
2
2
.
.
2
2
.
.
1
1
C
C
r
r
e
e
a
a
t
t
e
e
I
I
n
n
t
t
e
e
r
r
c
c
e
e
p
p
t
t
o
o
r
r
-
-
I
I
m
m
p
p
l
l
e
e
m
m
e
e
n
n
t
t
s
s
H
H
a
a
n
n
d
d
l
l
e
e
r
r
I
I
n
n
t
t
e
e
r
r
c
c
e
e
p
p
t
t
o
o
r
r
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to create Interceptor Class by using implements HandlerInterceptor.
Application Schema [Results]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
P
P
r
r
o
o
c
c
e
e
d
d
u
u
r
r
e
e
Create Project: springboot_filter_create (add Spring Boot Starters from the table)
Create Package: controllers (inside main package)
Create Class: MyController.java (inside controllers package)
Create Package: interceptors (inside main package)
Create Class: MyInterceptor.java (inside controllers package)
Create Class: InterceptorConfig.java (inside controllers package)
MyController.java
package com.ivoronline.springboot_interceptor.controllers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/Hello")
public String hello() {
System.out.println("Controller:");
return "Hello from Controller";
}
}
MyInterceptor
MyController
Request
Response
http://localhost:8080/Hello
Request
Response
hello()
InterceptorConfig
MyInterceptor.java
package com.ivoronline.springboot_interceptor.interceptors;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
//====================================================================
// PRE HANDLE
//====================================================================
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.print("MyInterceptor: preHandle() ");
System.out.println(request.getMethod());
return true;
}
//====================================================================
// POST HANDLE
//====================================================================
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.print("MyInterceptor: postHandle() ");
System.out.println(response.getStatus());
}
//====================================================================
// AFTER COMPLETION
//====================================================================
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
System.out.print("MyInterceptor: afterCompletion() ");
System.out.println(response.getStatus());
}
}
InterceptorConfig.java
package com.ivoronline.springboot_interceptor.interceptors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Component
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor);
}
}
R
R
e
e
s
s
u
u
l
l
t
t
s
s
http://localhost:8080/Hello
Console
MyInterceptor: preHandle() GET
Controller:
MyInterceptor: postHandle() 200
MyInterceptor: afterCompletion() 200
Application Structure
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2
2
.
.
2
2
.
.
2
2
C
C
r
r
e
e
a
a
t
t
e
e
I
I
n
n
t
t
e
e
r
r
c
c
e
e
p
p
t
t
o
o
r
r
C
C
h
h
a
a
i
i
n
n
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to create Interceptor Chain.
Order in which they are added to configuration defines order in which their Methods are executed
their prehandle() Methods are executed during HTTP Request in that order
their posthandle() Methods are executed during HTTP Response in reverse order
their afterCompletion() Methods are executed during HTTP Response in reverse order
Application Schema [Results]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
P
P
r
r
o
o
c
c
e
e
d
d
u
u
r
r
e
e
Create Project: springboot_filter_create (add Spring Boot Starters from the table)
Create Package: controllers (inside main package)
Create Class: MyController.java (inside controllers package)
Create Package: interceptors (inside main package)
Create Class: MyInterceptor1.java (inside controllers package)
Create Class: MyInterceptor2.java (inside controllers package)
Create Class: InterceptorConfig.java (inside controllers package)
MyController.java
package com.ivoronline.springboot_interceptor.controllers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/Hello")
public String hello() {
System.out.println("Controller:");
return "Hello from Controller";
}
}
MyInterceptor1
MyController
Request
Response
MyInterceptor2
Request
Response
Request
Response
InterceptorConfig
MyInterceptor1.java
package com.ivoronline.springboot_interceptor_chain.interceptors;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor1 implements HandlerInterceptor {
//====================================================================
// PRE HANDLE
//====================================================================
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.print("MyInterceptor1: preHandle() ");
return true;
}
//====================================================================
// POST HANDLE
//====================================================================
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.print("MyInterceptor1: postHandle() ");
}
//====================================================================
// AFTER COMPLETION
//====================================================================
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
System.out.print("MyInterceptor1: afterCompletion() ");
}
}
MyInterceptor2.java
package com.ivoronline.springboot_interceptor_chain.interceptors;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor2 implements HandlerInterceptor {
//====================================================================
// PRE HANDLE
//====================================================================
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.print("MyInterceptor2: preHandle() ");
return true;
}
//====================================================================
// POST HANDLE
//====================================================================
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.print("MyInterceptor2: postHandle() ");
}
//====================================================================
// AFTER COMPLETION
//====================================================================
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
System.out.print("MyInterceptor2: afterCompletion() ");
}
}
InterceptorConfig.java
package com.ivoronline.springboot_interceptor_chain.interceptors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Component
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired MyInterceptor1 myInterceptor1;
@Autowired MyInterceptor2 myInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//ORDER IN WHICH THEY ARE ADDED DEFINES ORDER IN WHICH THEIR METHODS ARE EXECUTED
//- prehandle() Methods are executed during HTTP Request in that order
//- posthandle() Methods are executed during HTTP Response in reverse order
//- afterCompletion() Methods are executed during HTTP Response in reverse order
registry.addInterceptor(myInterceptor1);
registry.addInterceptor(myInterceptor2);
}
}
R
R
e
e
s
s
u
u
l
l
t
t
s
s
http://localhost:8080/Hello
Console
MyInterceptor1: preHandle()
MyInterceptor2: preHandle()
Controller:
MyInterceptor2: postHandle()
MyInterceptor1: postHandle()
MyInterceptor2: afterCompletion()
MyInterceptor1: afterCompletion()
Application Structure
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2
2
.
.
2
2
.
.
3
3
H
H
T
T
T
T
P
P
R
R
e
e
q
q
u
u
e
e
s
s
t
t
/
/
R
R
e
e
s
s
p
p
o
o
n
n
s
s
e
e
-
-
G
G
e
e
t
t
P
P
a
a
r
r
a
a
m
m
e
e
t
t
e
e
r
r
s
s
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to use Interceptor to get HTTP Request/Response Parameters.
Application Schema [Results]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
P
P
r
r
o
o
c
c
e
e
d
d
u
u
r
r
e
e
Create Project: springboot_filter_create (add Spring Boot Starters from the table)
Create Package: controllers (inside main package)
Create Class: MyController.java (inside controllers package)
Create Package: interceptors (inside main package)
Create Class: MyInterceptor.java (inside controllers package)
Create Class: InterceptorConfig.java (inside controllers package)
MyController.java
package com.ivoronline.springboot_interceptor_gethttprequestresponseparameters.controllers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/Hello")
public String hello() {
System.out.println("Controller:");
return "Hello from Controller";
}
}
MyInterceptor
MyController
Request
Response
http://localhost:8080/Hello
Request
Response
hello()
InterceptorConfig
MyInterceptor.java
package com.ivoronline.springboot_interceptor_gethttprequestresponseparameters.interceptors;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
//====================================================================
// PRE HANDLE
//====================================================================
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("MyInterceptor: preHandle() ");
System.out.println(request.getMethod ()); //GET
System.out.println(request.getProtocol ()); //HTTP/1.1
System.out.println(request.getServerName()); //localhost
System.out.println(request.getServerPort()); //8080
System.out.println(request.getParameter("username")); //myuser
return true;
}
//====================================================================
// POST HANDLE
//====================================================================
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.println("MyInterceptor: postHandle() ");
System.out.println(response.getStatus()); //200
}
//====================================================================
// AFTER COMPLETION
//====================================================================
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
System.out.println("MyInterceptor: afterCompletion() ");
System.out.println(response.getStatus());
}
}
InterceptorConfig.java
package com.ivoronline.springboot_interceptor_gethttprequestresponseparameters.interceptors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Component
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor);
}
}
R
R
e
e
s
s
u
u
l
l
t
t
s
s
http://localhost:8080/Hello?username=myuser
Console
MyInterceptor: preHandle()
GET
HTTP/1.1
localhost
8080
myuser
Controller:
MyInterceptor: postHandle()
200
MyInterceptor: afterCompletion()
200
Application Structure
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>